package com.free.ext.shiro;

import org.apache.shiro.SecurityUtils;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Random;

/**
 * <p>
 * 功能概述:
 * </p>
 * <p>
 * 功能详述:
 * </p>
 */
public class SessionManager {
    /*========================================================================*
     *                         Public Fields (公共属性)
     *========================================================================*/

    /*========================================================================*
     *                         Private Fields (私有属性)
     *========================================================================*/

    /*========================================================================*
     *                         Construct Methods (构造方法)
     *========================================================================*/

    /*========================================================================*
     *                         Public Methods (公有方法)
     *========================================================================*/

    public static <T> T get(String key) {
        Object value = SecurityUtils.getSubject().getSession().getAttribute(key);
        return (T) value;
    }

    public static <T> T get(String key, T defaultValue) {
        Object value = SecurityUtils.getSubject().getSession().getAttribute(key);
        if (value == null) {
            return defaultValue;
        }
        return (T) value;
    }

    public static void set(String key, Object value) {
        SecurityUtils.getSubject().getSession().setAttribute(key, value);
    }

    public static boolean has(String key) {
        Object value = get(key);
        return value != null;
    }

    public static void add(String key) {
        set(key, "1");
    }

    public static void remove(String key)
    {
        SecurityUtils.getSubject().getSession().removeAttribute(key);
    }

    public static void increase(String key) {
        int current = get(key, 0);
        set(key, current + 1);
    }

    public static String getId() {
        try {
            return SecurityUtils.getSubject().getSession().getId().toString();
        }
        catch (Exception e) {
            return randomId();
        }
    }

    public static <T> T getCurrentUser(){
       return  (T)SecurityUtils.getSubject().getPrincipal();
    }

    public static String randomId()
    {
        String dateStr = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddhhmmss"));
        int random =new Random().nextInt(9000)+1000;
        return dateStr + String.valueOf(random);
    }

    public static boolean isAuthenticated()
    {
        return SecurityUtils.getSubject().isAuthenticated();
    }
    /*========================================================================*
     *                         Private Methods (私有方法)
     *========================================================================*/
}
